Přeskočit na hlavní obsah

Otázka č. 22 - Procedury, funkce, triggery, package a objekty

Procedury

  • skupina SQL příkazů, které jsou uloženy pod jedním názvem a mohou být volány v rámci jiných SQL příkazů.
CREATE PROCEDURE GetCustomerName (IN customer_id INT)
BEGIN
SELECT name FROM customers WHERE id = customer_id;
END

Typy parametrů

  • IN
    • Procedura přijímá hodnotu od volajícího.
  • OUT
    • Procedura vrací hodnotu volajícímu.
  • INOUT
    • Procedura přijímá hodnotu od volajícího a může ji změnit.

Rozdíly mezi procedurou a funkcí

  • Procedura nevrací hodnotu, zatímco funkce vrací hodnotu.
  • procedura může vracet různý počet hodnot (0 až N)

Volání procedury

CALL GetCustomerName(1);

Funkce

  • soubor SQL příkazů, který přijímá vstupní parametry, provádí operace a vrací výstup.
CREATE FUNCTION CalculateTotal (price DECIMAL(10,2), quantity INT)
RETURNS DECIMAL(10,2)
BEGIN
RETURN price * quantity;
END

BiF x UDF

  • BiF (Built-in Function): Standardní funkce poskytované DBMS.
  • UDF (User-defined Function): Funkce vytvořená uživatelem.

Rozdíly mezi procedurou a funkcí

  • Funkce vrací hodnotu, zatímco procedura nevrací hodnotu.
  • Funkce vrací vždy jen jednu hodnotu.

Volání funkce

SELECT CalculateTotal(10.5, 5);

Triggery

  • speciální typ uložené procedury, která je automaticky spuštěna při určité události na dané tabulce.
CREATE TRIGGER increment_animal AFTER INSERT ON animals FOR EACH ROW 
BEGIN
IF NEW.name = 'Moose' THEN
UPDATE animal_count SET animal_count.animals = animal_count.animals+100;
ELSE
UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
END IF;
END;

Typy triggerů

  • BEFORE
    • Trigger spuštěn před provedením události.
  • AFTER
    • Trigger spuštěn po provedení události.

Multifunkční trigger

  • Triggery mohou být definovány na tabulce tak, aby reagovaly na různé události (INSERT, UPDATE, DELETE)
  • Trigger, který reaguje na více událostí
CREATE TRIGGER employee_audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO audit_table (action, employee_id, timestamp)
VALUES ('INSERT', :NEW.employee_id, CURRENT_TIMESTAMP);
ELSIF UPDATING THEN
INSERT INTO audit_table (action, employee_id, timestamp)
VALUES ('UPDATE', :NEW.employee_id, CURRENT_TIMESTAMP);
ELSIF DELETING THEN
INSERT INTO audit_table (action, employee_id, timestamp)
VALUES ('DELETE', :OLD.employee_id, CURRENT_TIMESTAMP);
END IF;
END;

Vzájemné volání triggerů

  • Trigger může spustit další trigggery v závislosti na provedené akci.
CREATE TRIGGER after_insert_trigger AFTER INSERT ON emplloyees FOR EACH ROW 
BEGIN

-- Pokud se vloží nový zaměstnanec, spusťte trigger pro aktualizaci počtu zaměstnanců
CALL update_employee_count();
END;

Package

  • seskupení procedur, funkcí a datových typů do logické jednotky, která může být sdílena mezi uživateli.
CREATE PACKAGE EmployeePackage AS
PROCEDURE GetEmployeeName (emp_id INT);
FUNCTION CalculateSalary (salary DECIMAL, bonus DECIMAL) RETURN DECIMAL;
END EmployeePackage;

CREATE PACKAGE BODY EmployeePackage AS
PROCEDURE GetEmployeeName (emp_id INT) AS
BEGIN
SELECT name INTO emp_name FROM employees WHERE id = emp_id;
END GetEmployeeName;

FUNCTION CalculateSalary (salary DECIMAL, bonus DECIMAL) RETURN DECIMAL AS
BEGIN
RETURN salary + bonus;
END CalculateSalary;

END EmployeePackage;

Rozdělení

  • Hlavička, deklarace
CREATE PACKAGE EmployeePackage AS
PROCEDURE GetEmployeeName (emp_id INT);
FUNCTION CalculateSalary (salary DECIMAL, bonus DECIMAL) RETURN DECIMAL;
END EmployeePackage;
  • Tělo, implementace
CREATE PACKAGE BODY EmployeePackage AS
PROCEDURE GetEmployeeName (emp_id INT) AS
BEGIN
SELECT name INTO emp_name FROM employees WHERE id = emp_id;
END GetEmployeeName;

FUNCTION CalculateSalary (salary DECIMAL, bonus DECIMAL) RETURN DECIMAL AS
BEGIN
RETURN salary + bonus;
END CalculateSalary;

END EmployeePackage;

Objekty

  • Datové typy jsou datové typy, které umožňují ukládání a manipulaci s daty jako s objekty.
CREATE TYPE Address AS OBJECT (
street VARCHAR2(50),
city VARCHAR2(50),
state VARCHAR2(2),
zip VARCHAR2(10),

MEMBER FUNCTION getFullAddress RETURN VARCHAR2
);

CREATE TYPE BODY Address AS
MEMBER FUNCTION getFullAddress RETURN VARCHAR2 AS
BEGIN
RETURN street || ', ' || city || ', ' || state || ' ' || zip;
END;

END;

Použití

  • PostgreSQL
    • je známý svou podporou objektově-relačního modelu a nabízí robustní podporu pro objektové datové typy včetně vlastních typů, složitých typů a tabulkových typů.
  • Oracle Database
    • Database podporuje objektové datové typy a umožňuje definovat a používat objektové typy, kolekce (seznamy, pole, asociativní pole), a další složité datové struktury.
  • IBM Db2
    • nabízí podporu pro vytváření a používání uživatelsky definovaných datových typů (UDT) a vlastních typů (user-defined types), což umožňuje modelování komplexních datových struktur.
  • Microsoft SQL Server
    • podporuje uživatelsky definované typy (User-defined types), které umožňují vytvářet objektové datové typy a definovat vlastní datové typy pro použití v databázovém schématu.
  • MariaDB
    • Od verze 10.3 podporuje MariaDB objektové datové typy. MariaDB nabízí podporu pro objektové datové typy, což umožňuje vytvářet a používat vlastní složité datové struktury.